package com.zyl.Ecs.realtime.datasource;

import com.zyl.Ecs.common.utils.CUtil;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @version v1.0
 * @ProjectName: Ecs
 * @Package: com.zyl.Ecs.realtime.datasource
 * @ClassName: DynamicDataSource
 * @Description
 *      自定义动态数据源
 *      固定声明方式：
 *          1、继承AbstractRoutingDataSource
 *          2、重写抽象父类中的determineCurrentLookupKey()方法
 *      方法的作用：
 *      是一个回调方法。
 *      框架每次调用Mapper中的方法之前会先调用该方法，
 *      获取数据源的Key，从动态数据源对象中根据此Key获取Value。
 *      Value就是动态数据源中包含的具体某个单体数据源对象，
 *      通过这个数据源对象构建SqlSession，获取和数据库的连接……
 * @Author 翟玉龙
 * @Date 2024/12/6-13:48
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * Spring在开始进行数据库操作时会通过这个方法来决定使用哪个数据库
     *
     * @return 动态数据源对象的Key
     */
    @Override
    protected Object determineCurrentLookupKey() {
        /* 从线程上下文中取出本次应该使用的数据源Key（Enum类型） */
        DataSourceTypeEnum typeEnum = DataSourceContextHolder.getDataSourceType();
        CUtil.logInfo(
                String.format(
                        "[ Change data source ] ThreadName: %s >> %s",
                        Thread.currentThread().getName(), typeEnum.name()
                )
        );
        return typeEnum;
    }
}